// rulermanager.h
#ifndef RULERMANAGER_H
#define RULERMANAGER_H

#include <QObject>
#include <QVector>
#include <QRect>
#include "rulebar.h"
#include "../view/ndt_base_view.h" // 包含视图类型和旋转类型定义
#include <QGraphicsView>

namespace eintik::presentation::viewcore {

// 前向声明父视图类
class NdtScanView;

/**
 * @class RulerManager
 * @brief 标尺管理类，负责多类型标尺的创建、配置、布局及状态控制
 * @details 适配不同视图类型（A扫描/S扫描/C扫描）和旋转状态，统一管理标尺的显示逻辑
 */
class RulerManager : public QObject
{
    Q_OBJECT
    static const QVector<QTransform> rotateForm; // 预定义旋转变换矩阵，用于标尺旋转

public:
    /**
     * @brief 构造函数
     * @param parent 父视图指针， ownership由父对象接管
     */
    explicit RulerManager(NdtScanView *parent = nullptr);

    /**
     * @brief 析构函数，释放所有标尺资源
     */
    ~RulerManager();

    /**
     * @brief 初始化标尺集合，创建预设的4个标尺（左/底/右1/右2）
     */
    void initRulers();

    /**
     * @brief 设置指定标尺的数值范围和单位
     * @param id 标尺索引（0-3分别对应左/底/右1/右2）
     * @param rulerStart 起始值
     * @param rulerEnd 结束值
     * @param unit 单位字符串（如"mm"、"%"）
     */
    void setRulerRange(int32_t id, double rulerStart, double rulerEnd, const QString &unit);

    /**
     * @brief 获取指定标尺的数值范围
     * @param id 标尺索引
     * @param rulerStart 输出参数，起始值
     * @param rulerEnd 输出参数，结束值
     */
    void getRulerRange(int32_t id, double &rulerStart, double &rulerEnd);

    /**
     * @brief 为指定标尺设置颜色映射（主要用于颜色条标尺）
     * @param colorVector 颜色序列
     * @param id 标尺索引，默认值为2（右1标尺）
     */
    void setColorMap(const QVector<QColor> &colorVector, int32_t id = 2);

    /**
     * @brief 根据旋转类型更新标尺位置和变换
     * @param rotateType 旋转类型（0°/90°/180°/270°/垂直镜像）
     */
    void refreshRulerPosition(RotateType rotateType);

    /**
     * @brief 根据视图类型初始化标尺配置
     * @param type 视图类型（A_SCAN/S_SCAN/C_SCAN_0/C_SCAN_1）
     */
    void initView(VIEW_TYPE type = VIEW_TYPE::A_SCAN);

    /**
     * @brief 计算视图边距（根据标尺启用状态）
     * @param left 输出参数，左边距
     * @param top 输出参数，上边距
     * @param right 输出参数，右边距
     * @param bottom 输出参数，下边距
     */
    void calculateMargins(int &left, int &top, int &right, int &bottom) const;

    /**
     * @brief 获取指定标尺指针
     * @param id 标尺索引
     * @return 成功返回标尺指针，失败返回nullptr
     */
    QRuleBar *getRuler(int32_t id) const;

    /**
     * @brief 检查指定标尺是否启用
     * @param id 标尺索引
     * @return 启用返回true，否则返回false
     */
    bool isRulerEnabled(int32_t id) const;

    /**
     * @brief 调整标尺大小和位置（视图尺寸变化时调用）
     * @param viewWidth 视图宽度
     * @param viewHeight 视图高度
     * @param left 左边距参考值
     * @param right 右边距参考值
     * @param bottom 底边距参考值
     */
    void resizeRulers(int viewWidth, int viewHeight, int left, int right, int bottom);

    void updateRuler(int32_t id);
    void updateRulers();
private:
    NdtScanView *m_parentView;    // 关联的父视图
    QVector<QRuleBar *> m_rulers; // 标尺集合，存储4个预设标尺
    QVector<QRect> m_rulerRect;   // 标尺几何区域缓存，用于旋转时快速定位
};

}
#endif // RULERMANAGER_H
